package cn.com.blueInfo.bpm.template.request;

import cn.com.blueInfo.bpm.common.request.BaseDTO;
import cn.com.blueInfo.bpm.common.request.BaseQueryDTO;
import cn.com.blueInfo.bpm.template.enums.WorkItemStatus;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;

/**
 * 节点任务实例表 接收参数机校验
 * @author suxch
 * @since 2025-08-24 01:41:16
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "节点任务实例 接收参数及校验")
public class WorkItemDTO extends BaseDTO {

    /** 流程实例ID */
    @NotNull(message = "流程实例ID 不能为空")
    @Schema(description = "流程实例ID")
    private Long instanceId;
    /** 节点ID */
    @NotNull(message = "节点ID 不能为空")
    @Schema(description = "节点ID")
    private Long nodeId;
    /** 节点编码（冗余，展示用） */
    @Schema(description = "节点编码（冗余，展示用）")
    private String nodeCode;
    /** 节点类型（冗余，展示用） */
    @Schema(description = "节点类型（冗余，展示用）")
    private String nodeType;
    /** 任务处理人ID */
    @NotNull(message = "任务处理人ID 不能为空")
    @Schema(description = "任务处理人ID")
    private Long handlerId;
    /** 任务处理人姓名（冗余，展示用） */
    @Schema(description = "任务处理人姓名（冗余，展示用）")
    private String handlerName;
    /** 任务状态：TODO-待办，IN_PROCESS-处理中，COMPLETED-已完成，CANCELED-已取消 */
    @NotNull(message = "任务状态 不能为空")
    @Schema(description = "任务状态：TODO-待办，IN_PROCESS-处理中，COMPLETED-已完成，CANCELED-已取消")
    private WorkItemStatus workItemStatus;
    /** 任务处理页面路径 */
    @NotBlank(message = "任务处理页面路径 不能为空")
    @Schema(description = "任务处理页面路径")
    private String viewPath;
    /** 开始处理时间 */
    @Schema(description = "开始处理时间")
    private LocalDateTime startTime;
    /** 完成时间 */
    @Schema(description = "完成时间")
    private LocalDateTime completeTime;
    /** 审批意见 */
    @Schema(description = "审批意见")
    private String opinion;
    /** 提交的决策名称 */
    @Schema(description = "提交的决策名称")
    private String decision;
    /** 上一节点ID */
    @Schema(description = "上一节点ID")
    private Long prevNodeId;
    /** 上一任务ID */
    @Schema(description = "上一任务ID")
    private Long prevWorkItemId;
    /** 上一任务处理人ID */
    @Schema(description = "上一任务处理人ID")
    private Long prevHandlerId;

    /**
     * 节点任务实例 接收分页查询参数
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "节点任务实例 接收分页查询参数")
    public static class QueryDTO extends BaseQueryDTO {

        /** 流程实例ID */
        @Schema(description = "流程实例ID")
        private Long instanceId;
        /** 节点ID */
        @Schema(description = "节点ID")
        private Long nodeId;
        /** 节点编码（冗余，展示用） */
        @Schema(description = "节点编码（冗余，展示用）")
        private String nodeCode;
        /** 节点类型（冗余，展示用） */
        @Schema(description = "节点类型（冗余，展示用）")
        private String nodeType;
        /** 任务处理人ID */
        @Schema(description = "任务处理人ID")
        private Long handlerId;
        /** 任务处理人姓名（冗余，展示用） */
        @Schema(description = "任务处理人姓名（冗余，展示用）")
        private String handlerName;
        /** 任务状态：TODO-待办，IN_PROCESS-处理中，COMPLETED-已完成，CANCELED-已取消 */
        @Schema(description = "任务状态：TODO-待办，IN_PROCESS-处理中，COMPLETED-已完成，CANCELED-已取消")
        private WorkItemStatus workItemStatus;
        /** 任务处理页面路径 */
        @Schema(description = "任务处理页面路径")
        private String viewPath;
        /** 开始处理时间 */
        @Schema(description = "开始处理时间")
        private LocalDateTime startTime;
        /** 完成时间 */
        @Schema(description = "完成时间")
        private LocalDateTime completeTime;
        /** 审批意见 */
        @Schema(description = "审批意见")
        private String opinion;
        /** 提交的决策名称 */
        @Schema(description = "提交的决策名称")
        private String decision;
        /** 上一节点ID */
        @Schema(description = "上一节点ID")
        private Long prevNodeId;
        /** 上一任务ID */
        @Schema(description = "上一任务ID")
        private Long prevWorkItemId;
        /** 上一任务处理人ID */
        @Schema(description = "上一任务处理人ID")
        private Long prevHandlerId;

    }

    /**
     * 节点任务实例 接收部分更新参数及校验
     * @author suxch
     * @since 2025-08-21 05:08:55
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Schema(description = "节点任务实例 接收部分更新参数及校验")
    public static class UpdatePartialDTO extends BaseDTO {

        /** 节点编码（冗余，展示用） */
        @Schema(description = "节点编码（冗余，展示用）")
        private String nodeCode;
        /** 节点类型（冗余，展示用） */
        @Schema(description = "节点类型（冗余，展示用）")
        private String nodeType;
        /** 任务处理人姓名（冗余，展示用） */
        @Schema(description = "任务处理人姓名（冗余，展示用）")
        private String handlerName;
        /** 开始处理时间 */
        @Schema(description = "开始处理时间")
        private LocalDateTime startTime;
        /** 完成时间 */
        @Schema(description = "完成时间")
        private LocalDateTime completeTime;
        /** 审批意见 */
        @Schema(description = "审批意见")
        private String opinion;
        /** 提交的决策名称 */
        @Schema(description = "提交的决策名称")
        private String decision;
        /** 上一节点ID */
        @Schema(description = "上一节点ID")
        private Long prevNodeId;
        /** 上一任务ID */
        @Schema(description = "上一任务ID")
        private Long prevWorkItemId;
        /** 上一任务处理人ID */
        @Schema(description = "上一任务处理人ID")
        private Long prevHandlerId;

    }

}